package com.xiang._01;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * 数组转list：
 *      Arrays.asList(xxx) ：创建的是不可变列表，不能删除和新增元素
 *      new ArrayList<>(Arrays.asList(xxx) : 相当于用列表创建列表，属于深拷贝的一种表现，获取到的列表支持新增、删除
 *          推荐写法 Collections.addAll()
 *
 * 列表转数组
 *      list.toArray : 如果需要指定数组类型，则传参指定
 */
public class Array2List {
    public static void main(String[] args) {

//        ary2list();
        //优化
//        ary2list1();

        //推荐
        ary2listV3();

        //列表转数组
        List<String> list = Arrays.asList("a", "b", "c");
// 返回的是Object[] 数组
        Object[] cell = list.toArray();
// 如果需要指定数组类型，可以传一个指定各类型的空的数组
// 也可以传一个与目标列表长度相等的数组，这样会将列表中的元素拷贝到这个数组中
        String[] strCell = list.toArray(new String[]{});

    }

    /**
     * Arrays.asList 创建的列表，不允许新增，删除元素
     */
    public static void ary2list() {
        String[] ary = new String[]{"1", "a"};
        List<String> list = Arrays.asList(ary);
        System.out.println(list);
        // java.lang.UnsupportedOperationException
        list.add("c");
        System.out.println(list);
    }

    /**
     * 优化
     */
    public static void ary2list1() {
        String[] ary = new String[]{"1", "a"};
        //属于深拷贝的实现
        List<String> out = new ArrayList<>(Arrays.asList(ary));
        out.add("hello");
        System.out.println(out);

        // Collections.unmodifiableList 创建
        List<String> unModifyList = Collections.unmodifiableList(out);
        System.out.println(unModifyList);
    }

    /**
     * Collections
     */
    public static void ary2listV3() {
        String[] ary = new String[]{"1", "a"};
// 创建列表，并指定长度，避免可能产生的扩容
        List<String> out = new ArrayList<>(ary.length);
// 实现数组添加到列表中
        Collections.addAll(out, ary);
// 因为列表为我们定义的ArrayList，因此可以对它进行增删改
        out.add("hello");
        System.out.println(out);
    }


}
